Skip to content

Nginx 使用 acme.sh 生成和自动续签证书

安装 acme.sh

Github:https://github.com/acmesh-official/acme.sh

中文文档:https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E

shell
# 邮箱用于提醒证书过期
curl https://get.acme.sh | sh -s email=mwjwork@qq.com

通过安装日志,可以知道安装位置,这里安装到了 /root/.acme.sh/ 目录下。

修改默认 CA

acme.sh脚本默认ca服务器是zerossl,经常出错,会导致获取证书的时候一直出现:Pending, The CA is processing your order, please just wait.

只需要把ca服务器改成letsencrypt 即可,虽然更改以后还是有概率出现pending,但基本2-3次即可成功

shell
cd /root/.acme.sh/

./acme.sh --set-default-ca --server letsencrypt

DNS 验证

注:手动验证不支持证书到期后自动更新证书,这里采用自动验证(DNS API)。

以阿里的为例。https://github.com/acmesh-official/acme.sh/wiki/dnsapi#dns_ali

阿里 RAM 用户及需要的权限

创建 RAM 用户:https://ram.console.aliyun.com/users

创建时勾选复选框:使用永久 AccessKey 访问创建 AccessKey ID 和 AccessKey Secret,支持通过 API 或其他开发工具访问

然后把 key 和 secret 复制保存下来。

然后进入该 RAM 用户的权限管理,并授予以下四个权限:

shell
AliyunDNSFullAccess
AliyunHTTPDNSFullAccess
AliyunPubDNSFullAccess
AliyunDomainFullAccess

导入 key 和 secret

shell
export Ali_Key="key123456789"

export Ali_Secret="secret123456789"

签发证书

shell
./acme.sh --issue --dns dns_ali -d aday.fun -d *.aday.fun

执行后,Ali_Key 和 Ali_Secret 将保存在 ~/.acme.sh/account.conf 中,并在需要时自动获取,无需手动再设置。

复制证书

证书生成好以后,我们需要把证书复制给对应的 Apache、Nginx 或其他服务器去使用。

必须使用 --install-cert 命令来把证书复制到目标文件,请勿直接使用 ~/.acme.sh/ 目录下的证书文件,这里面的文件都是内部使用,而且目录结构将来可能会变化。

Nginx 示例:

shell
mkdir -p /etc/nginx/ssl

./acme.sh --install-cert -d aday.fun -d *.aday.fun \
--key-file        /etc/nginx/ssl/aday.fun.key \
--fullchain-file  /etc/nginx/ssl/fullchain.cer \
--reloadcmd      "service nginx reload"

Nginx 的配置项 ssl_certificate 需要使用 /etc/nginx/ssl/fullchain.cer ,而非 /etc/nginx/ssl/"domain".cer ,否则 SSL Labs 的测试会报证书链问题(Chain issues Incomplete)。

默认情况下,证书每 60 天更新一次(可自定义)。更新证书后,Apache 或者 Nginx 服务会通过 reloadcmd 传递的命令自动重载配置。

注意:reloadcmd 非常重要。证书会自动申请续签,但是如果没有正确的 reloadcmd 命令,证书可能无法被重新应用到 Apache 或者 Nginx,因为配置没有被重载。

Nginx 配置参考:Nginx 开启 https 访问

查看已安装证书

shell
./acme.sh --info -d *.aday.fun

更新证书

目前证书每 60 天自动更新,你无需任何操作。

shell
crontab -l
56 * * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

但是你也可以强制续签证书:

shell
./acme.sh --renew -d aday.fun -d *.aday.fun --force

使用 openssl 转换 fullchain.cer 为 fullchain.crt 证书

如果不需要 .crt 证书,则跳过该章节(nginx 可以不需要,只使用 fullchain.cer 和 aday.fun.key 即可。)。

但有些时候我们需要其他格式的证书,比如: FRP 内网穿透工具启用 https 时,需要 .crt 证书。

FRP 文档参考:FRP:为本地 HTTP 服务启用 HTTPS

shell
cd /root/.acme.sh/aday.fun_ecc
# cer 转 crt
$ openssl x509 -inform PEM -in fullchain.cer -out fullchain.crt

更多转换参考:Linux 使用 openssl 转换证书格式